package gruppoSoluzione.mainService;

/**
 * Un log del DB.
 * 
 * Implementa il concetto di 'Log Simile'.
 * Per simile si intende: stesso luogo, azione e operatore, ma differenti numero e modello
 * 
 * @author Alessandro Martinelli
 */
public class ServiceDBLog implements Comparable<ServiceDBLog>{

	private String luogo;
	private String azione;
	private String operatore;
	private int numero;
	private String modello;
	
	
	public ServiceDBLog(String luogo, String azione, String operatore) {
		super();
		this.luogo = luogo;
		this.azione = azione;
		this.operatore = operatore;
	}

	/**
	 * Genera un'altra istanza di ServiceDBLog simile a questa.
	 * Per simile si intende: stesso luogo, azione e operatore, ma differenti numero e modello
	 * @return
	 */
	public ServiceDBLog generaLogSimile(){
		return new ServiceDBLog(luogo, azione, operatore);
	}
	
	//questo è un override del metodo clone di Object!!
	@Override
	public ServiceDBLog clone() {
		ServiceDBLog log=new ServiceDBLog(luogo, azione, operatore);
		log.numero=numero;
		log.modello=modello;
		return log;
	}
	
	/**
	 * Genera un'altra istanza di ServiceDBLog simile a questa.
	 * Per simile si intende: stesso luogo, azione e operatore, ma differenti numero e modello
	 * @param numero Il numero di scatole di scarpe da inserire nel nuovo log
	 * @param modello Il modello di scarpe per il nuovo log
	 * @return
	 */
	public ServiceDBLog generaLogSimile(int numero,String modello){
		ServiceDBLog log = new ServiceDBLog(luogo, azione, operatore);
		log.numero=numero;
		log.modello=modello;
		return log;
	}
	
	/**
	 * Verifica se questo log è 'simile' ad un altro log.
	 * Per simile si intende: stesso luogo, azione e operatore, ma differenti numero e modello
	 * @param other
	 * @return un numero intero diverso da zero se i log non sono simili
	 */
	public int compareAsSimilar(ServiceDBLog other){
		int compare=luogo.compareTo(other.luogo);
		if(compare==0){
			compare=azione.compareTo(other.azione);
			if(compare==0){
				compare=operatore.compareTo(other.operatore);
			}
		}
		return compare;
	}
	
	/**
	 * Verifica se questo log è 'simile' ad un altro log.
	 * Per simile si intende: stesso luogo, azione e operatore, ma differenti numero e modello
	 * @param other
	 * @return true se i log sono simili
	 */
	public boolean isSimilar(ServiceDBLog other){
		return compareAsSimilar(other)==0;
	}
	
	@Override
	public int compareTo(ServiceDBLog other) {
		int compare=compareAsSimilar(other);
		if(compare==0){
			compare=modello.compareTo(other.modello);
		}
		return compare;
	}
	
	/**
	 * Aggiunge a questo log il numero di elemento di un altro log
	 * @param log
	 */
	public void addSize(ServiceDBLog log){
		this.numero+=log.numero;
	}

	public String getLuogo() {
		return luogo;
	}

	public String getAzione() {
		return azione;
	}

	public String getOperatore() {
		return operatore;
	}

	public int getNumero() {
		return numero;
	}

	public String getModello() {
		return modello;
	}
	
	//usate il toString solo per messaggi di debug!!
	@Override
	public String toString() {
		return luogo+","+azione+" ["+operatore+"]:"+numero+" "+modello;
	}
	
}
